Datos

Columna 1

Tabla de datos

Columna 2

Recolección de datos

Se utilizaron series de temperatura máxima (TX) de 53 estaciones meteorológicas del Estado de Río de Janeiro, proporcionadas por el Instituto Nacional de Meteorología de Brasil (INMET).

Preprocesamiento

  1. Para garantizar la calidad de los datos, también se recogieron las temperaturas mínimas diarias, lo que permitió sustituir los valores de TX inferiores al mínimo diario por códigos de datos que faltaban.

  2. El conjunto de datos contenía un número considerable de datos faltantes. Por lo tanto, para este estudio, seleccionamos estaciones con menos del 15% de datos faltantes desde el 1 de enero de 1971 hasta el 20 de marzo de 2024, asegurándonos de que su cobertura incluye los últimos siete meses de este periodo (desde septiembre de 2023 hasta marzo de 2024) con menos del 15% de datos faltantes también. En total, cinco estaciones cumplían estos criterios.

  3. Una vez identificadas las estaciones meteorológicas, rellenamos los huecos de sus series temporales TX utilizando la estación más similar.

Ubicación de las estaciones

Columna de texto sin título

Se accedió a los datos de elevación a través de Amazon Web Services Open Data Terrain Tiles utilizando el paquete elevatr R (Hollister et al., 2023).

Extremos

Row

PDF de TX

Máximo anual de TX

Alto da Boa Vista

Itaperuna

Campos

Cordeiro

Resende

---
title: "Temperatura Río de Janeiro"
author: "S. Collazo"
date: "`r Sys.Date()`"
output: 
  flexdashboard::flex_dashboard:
    theme: yeti
    source_code: embed
    logo: logos/rio1.jpg
    favicon: logos/ucm_favicon.png
    social: [ "twitter", "instagram", "menu" ]
    navbar:
      - { title: "Datasets", href: "https://bdmep.inmet.gov.br/#", align: left }
---



```{r setup, include=FALSE}
library(flexdashboard)
library(readr) 
library(readxl)
library(dplyr)
library(ggplot2)
library(DT)
library(plotly)
library(raster)
library(rgdal)
library(sf)
library(ggspatial)
library(cowplot)
library(rnaturalearth)  # Para obtener los datos de los países vecinos
library(elevatr)
library(tidyverse)
library(lubridate)
library(trend)


ubic <- read_xlsx("datos/ubic.xlsx")

df <- read_csv2("datos/tx7124_comp.csv")

df$fecha <- as.Date(df$fecha, format = "%d/%m/%Y")


```



# Datos {data-icon=fa-database}
## Columna 1 {data-width=450}
### Tabla de datos
```{r}
# Crear una tabla interactiva con DT
tabla_interactiva  <- datatable(df, options = list( pageLength = 50))
tabla_interactiva
```

## Columna 2 {data-width=550}

### Recolección de datos {data-height=350}


Se utilizaron series de temperatura máxima (TX) de 53 estaciones meteorológicas del Estado de Río de Janeiro, proporcionadas por el Instituto Nacional de Meteorología de Brasil (INMET).

**Preprocesamiento**

1. Para garantizar la calidad de los datos, también se recogieron las temperaturas mínimas diarias, lo que permitió sustituir los valores de TX inferiores al mínimo diario por códigos de datos que faltaban. 

2. El conjunto de datos contenía un número considerable de datos faltantes. Por lo tanto, para este estudio, seleccionamos estaciones con menos del 15% de datos faltantes desde el 1 de enero de 1971 hasta el 20 de marzo de 2024, asegurándonos de que su cobertura incluye los últimos siete meses de este periodo (desde septiembre de 2023 hasta marzo de 2024) con menos del 15% de datos faltantes también. En total, cinco estaciones cumplían estos criterios.


3. Una vez identificadas las estaciones meteorológicas, rellenamos los huecos de sus series temporales TX utilizando la estación más similar.




### Ubicación de las estaciones {data-height=600}
```{r fig.width=10, fig.height=5}
# Define el área de interés (AOI) para Río de Janeiro
# Coordenadas aproximadas del estado de Río de Janeiro
aoi <- st_as_sf(data.frame(
  x = c(-46, -40.9),
  y = c(-23.4, -20.6)
), coords = c("x", "y"), crs = 4326)

# Obtener datos de elevación para el AOI
elev_data <- get_elev_raster(locations = aoi, z = 10, clip = "locations")


# Descargar y cargar shapefile del estado de Río de Janeiro
# Asegúrate de tener el shapefile descargado en tu directorio de trabajo

# Cargar el shapefile de Brasil
brasil_shapefile <- st_read("datos/gadm41_BRA_1.shp", quiet = TRUE)


# Filtrar el shapefile para obtener solo el estado de Río de Janeiro
rio_shapefile <- brasil_shapefile[which(brasil_shapefile$NAME_1 == "Rio de Janeiro"),]


# Recortar el raster de elevación usando el shapefile de Río de Janeiro
rio_elev <- crop(elev_data, rio_shapefile)
rio_elev <- mask(rio_elev, rio_shapefile)


# Convertir el raster a un data frame para ggplot2
rio_elev_df <- as.data.frame(rio_elev, xy = TRUE)
names(rio_elev_df)[3] <- "elevation"



ID<-c('83007','83695','83738','83718','83698')

nome<-c('Alto da \n Boa Vista', 'Itaperuna', 'Campos',  'Cordeiro', 'Resende')

direction<-c('below', 'below','above','above','above')

ids<-which(ubic$id %in% ID)

ubi<-cbind(ubic[ids,],nome, direction)

# Crear una columna 'nudge_y' en función de 'direction'
nudge_y <- ifelse(ubi$direction == "above", 0.1, -0.125)


ubi2<-ubic[-ids,]

# Crear el mapa con ggplot2
rio<-ggplot() +
  geom_raster(data = rio_elev_df, aes(x = x, y = y, fill = elevation)) +
  scale_fill_gradientn(colours = terrain.colors(10), limits = c(0,2000),na.value = 'white') +
  geom_sf(data = rio_shapefile, fill = NA, color = "black", size = 0.5) +
  geom_point(data = ubi, aes(Lon, Lat), color = 'black', size = 2.5) +
  geom_point(data = ubi2, aes(Lon, Lat), color = 'blue', size = 0.7) +
  geom_text(data = ubi, aes(x = Lon, y = Lat, label = nome), nudge_y = nudge_y,
            size = 3, fontface = 'bold')+
  xlim(-44.9,-40.8)+
  coord_sf() +
  labs(
    title = "",
    fill = "Elevation (m)",
    x = "Longitude",
    y = "Latitude"
  ) +
  theme_bw() +
  theme(legend.key.height  = unit(1.2, "cm"),
    plot.title = element_text(hjust = 0.0),
    axis.text = element_text(size = 8)
  ) +
  annotation_scale(location = "br", width_hint = 0.2) +
  annotation_north_arrow(location = "tl", which_north = "true", 
                         style = north_arrow_fancy_orienteering)



# Obtener los datos del mundo (países)
world_shapefile <- ne_countries(scale = "medium", returnclass = "sf")

# Crear el mapa de Brasil resaltando el estado de Río de Janeiro y agregando fronteras
brasil_map <- ggplot() +
  geom_sf(data = world_shapefile, fill = "gray99", color = "black", size = 0.2) +  # Fronteras de países vecinos
  geom_sf(data = brasil_shapefile, fill = "gray30", color = "black", size = 0.2) +  # Fronteras de Brasil
  geom_sf(data = rio_shapefile, fill = "magenta", color = "black", size = 0.5) +  # Resaltar el estado de Rio
  coord_sf(xlim = c(-73, -32), ylim = c(-33, 5)) +  # Coordenadas para ajustar el mapa de Brasil
  theme_void() +  # Sin ejes ni etiquetas
  theme(
    panel.background = element_rect(fill = "lightblue"),  # Colorear el océano
    plot.background = element_rect(fill = "lightblue")  # Asegurarse que el fondo del gráfico también sea celeste
  ) +
  # Añadir un marco negro alrededor del inset usando geom_rect
  annotate("rect", xmin = -75, xmax = -30, ymin = -35, ymax = 7, color = "black", fill = NA, linewidth = 1)



final_map <- ggdraw() +
  draw_plot(rio) +  # Mapa principal
  draw_plot(brasil_map, x = 0.17, y = 0.61, width = 0.25, height = 0.25)  # Inset en la esquina inferior derecha

final_map

```


### Columna de texto sin título {data-height=50 .no-title}


<div style="font-size: 10px;">
Se accedió a los datos de elevación a través de Amazon Web Services Open Data Terrain Tiles utilizando el paquete elevatr R (Hollister et al., 2023).
</div>



# Extremos {data-icon=fa-temperature-arrow-up}

## Row {data-height=300}

### PDF de TX

```{r}
# Reacomodo la tabla con una fila de temperaturas y otra de estaciones

df_long <- df %>%
  pivot_longer(
    cols = -fecha,  # todas las columnas menos "fecha"
    names_to = "estacion",
    values_to = "temperatura"
  )



g1 <- ggplot(df_long, aes(x = temperatura, color = estacion, fill = estacion)) +
  geom_density(alpha = 0.3) +
  labs(title = "Distribución de Temperaturas por Estación",
       x = "Temperatura (°C)", y = "Densidad") +
  theme_minimal()

g2 <- ggplotly(g1)
g2

```



## Máximo anual de TX {data-height=700, .tabset}

```{r}
# Agrego columna con el año

df$anio <- year(df$fecha)

```


### Alto da Boa Vista

```{r}
# Estimo la TX máxima anual

df_alto <- df %>%
  group_by(anio) %>%
  summarise(TXx = max(`Alto da Boa Vista`))

#Ploteo serie temporal y tendencia


# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_alto$TXx)
slope <- sens.slope(df_alto$TXx)$estimates

# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")


# Graficar la serie temporal con personalización
gg <- ggplot(df_alto, aes(x = anio, y = TXx)) +
  geom_line(color = "blue", linewidth = 1) +  # Línea de la serie temporal
  geom_point(color = "blue", size = 2.5) +  # Puntos en la serie temporal
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = " ",
       x = "Year",
       y = "TXx [ºC]") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  annotate("text", x = 1982, y = max(df_alto$TXx), 
           label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")


ggout <- ggplotly(gg)
ggout


```


### Itaperuna

```{r}


df_ita <- df %>%
  group_by(anio) %>%
  summarise(TXx = max(Itaperuna))

#Ploteo serie temporal y tendencia


# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_ita$TXx)
slope <- sens.slope(df_ita$TXx)$estimates

# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")


# Graficar la serie temporal con personalización
gg <- ggplot(df_ita, aes(x = anio, y = TXx)) +
  geom_line(color = "blue", linewidth = 1) +  # Línea de la serie temporal
  geom_point(color = "blue", size = 2.5) +  # Puntos en la serie temporal
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = "Temperatura máxima anual",
       x = "Year",
       y = "TXx [ºC]") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  annotate("text", x = 1982, y = max(df_ita$TXx), 
           label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")


ggout <- ggplotly(gg)
ggout
```

### Campos

```{r}

df_campos <- df %>%
  group_by(anio) %>%
  summarise(TXx = max(Campos))

#Ploteo serie temporal y tendencia


# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_campos$TXx)
slope <- sens.slope(df_campos$TXx)$estimates

# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")


# Graficar la serie temporal con personalización
gg <- ggplot(df_campos, aes(x = anio, y = TXx)) +
  geom_line(color = "blue", linewidth = 1) +  # Línea de la serie temporal
  geom_point(color = "blue", size = 2.5) +  # Puntos en la serie temporal
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = " ",
       x = "Year",
       y = "TXx [ºC]") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  annotate("text", x = 1982, y = max(df_campos$TXx), 
           label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")


ggout <- ggplotly(gg)
ggout
```

### Cordeiro

```{r}


df_cordeiro <- df %>%
  group_by(anio) %>%
  summarise(TXx = max(Cordeiro))

#Ploteo serie temporal y tendencia


# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_cordeiro$TXx)
slope <- sens.slope(df_cordeiro$TXx)$estimates

# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")


# Graficar la serie temporal con personalización
gg <- ggplot(df_cordeiro, aes(x = anio, y = TXx)) +
  geom_line(color = "blue", linewidth = 1) +  # Línea de la serie temporal
  geom_point(color = "blue", size = 2.5) +  # Puntos en la serie temporal
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = " ",
       x = "Year",
       y = "TXx [ºC]") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  annotate("text", x = 1982, y = max(df_cordeiro$TXx), 
           label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")


ggout <- ggplotly(gg)
ggout
```


### Resende


```{r}


df_res <- df %>%
  group_by(anio) %>%
  summarise(TXx = max(Resende))

#Ploteo serie temporal y tendencia


# Realizar el test de Mann-Kendall
mk_result <- mk.test(df_res$TXx)
slope <- sens.slope(df_res$TXx)$estimates

# Crear el texto de la tendencia
trend_text <- paste0("Trend: ", round(slope, 3)*10, " [ºC per decade] *")


# Graficar la serie temporal con personalización
gg <- ggplot(df_res, aes(x = anio, y = TXx)) +
  geom_line(color = "blue", linewidth = 1) +  # Línea de la serie temporal
  geom_point(color = "blue", size = 2.5) +  # Puntos en la serie temporal
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = " ",
       x = "Year",
       y = "TXx [ºC]") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  annotate("text", x = 1982, y = max(df_res$TXx), 
           label = trend_text, hjust = 0, vjust = 1, size = 4, color = "black")


ggout <- ggplotly(gg)
ggout
```